package com.zsrt.devbase.common.utils;

import java.lang.reflect.Field;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

public class ReflectUtil {
	/**
	 * 复制两个相同类型对象的属性，从源对象 复制到 目标对象
	 * @param src 源对象
	 * @param tar 目标对象
	 * @param ignoreField 不需要复制的属性列表
	 */
	public static void copyProperties(Object src, Object tar, String... ignoreField) throws RuntimeException {
		if (src == null || tar == null || src.getClass() != tar.getClass()) {
			return;
		}
		Set<String> ignoreSet = new HashSet<String>();
		if (ignoreField != null) {
			Collections.addAll(ignoreSet, ignoreField);
		}
		Collections.addAll(ignoreSet, "serialVersionUID");
		Class<? extends Object> srcClazz = src.getClass();
		Field[] srcFields = srcClazz.getDeclaredFields();

		Class<? extends Object> tarClazz = src.getClass();
		Field[] tarFields = tarClazz.getDeclaredFields();
		try {
			// 遍历源对象属性
			for (Field f : srcFields) {
				//String type = f.getType().getName();
				// 设置通过反射访问该成员变量时取消访问权限检查
				f.setAccessible(true);
				// 遍历目标对象属性
				for (Field tarField : tarFields) {
					tarField.setAccessible(true);
					String tField = tarField.getName();
					// 忽略不复制的属性，属性名一致才复制
					if (!ignoreSet.contains(tField) && f.getName().equals(tField)) {
						tarField.set(tar, f.get(src));
					}
				}
			}
		} catch (IllegalArgumentException | IllegalAccessException e) {
			throw new RuntimeException(e);
		}
	}
}
